package com.atguigu.redis.single;

import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;

class MyResource{
    private volatile boolean FLAG=true;//默认开启，进行生产和消费
    private AtomicInteger atomicInteger= new AtomicInteger();

    BlockingQueue<String>blockingDeque=null;

    public MyResource(BlockingQueue<String> blockingDeque) {
        this.blockingDeque = blockingDeque;
        System.out.println(blockingDeque.getClass().getName());
    }
    public void myProd()throws Exception{
        String data=null;
        boolean retValue;
        while (FLAG){
           data =  atomicInteger.incrementAndGet()+"";
            retValue = blockingDeque.offer(data,2L, TimeUnit.SECONDS);
            if (retValue){
                System.out.println(Thread.currentThread().getName()+"\t 插入队列"+data+"成功");
            }else{
                System.out.println(Thread.currentThread().getName()+"\t 插入队列"+data+"失败");
            }
            TimeUnit.SECONDS.sleep(1);
        }
        System.out.println(Thread.currentThread().getName()+"\t 大老板叫停,生产动作结束");
    }
    public void myConsumer()throws Exception{
        String result=null;
        while (FLAG){
            blockingDeque.poll(2L,TimeUnit.SECONDS);
            if (null == result || "".equalsIgnoreCase(result)){
                FLAG =false;
                System.out.println(Thread.currentThread().getName()+"\t 2秒没取到蛋糕，消费退出");

            }
            System.out.println(Thread.currentThread().getName()+"\t 消费成功");
        }
    }
}
public class ProdConsumer_BlockQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        MyResource myResource = new MyResource(new ArrayBlockingQueue<String>(10));
        new Thread(()->{
            System.out.println(Thread.currentThread().getName()+"\t 生产线程启动");
            try {
                myResource.myProd();
            }catch (Exception e){

            }
        },"prod").start();

        new Thread(()->{
            System.out.println(Thread.currentThread().getName()+"\t 消费线程启动");
            try {
                myResource.myConsumer();
            }catch (Exception e){

            }
        },"consumer").start();

        TimeUnit.SECONDS.sleep(1);



    }
}
